#pragma once
#include <iostream>
#include <string>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/wait.h>

#include "../common/common.hpp"
#include "../common/log.hpp"

namespace wjh_compiler
{
    using namespace wjh_util;
    class Compiler
    {
    public:
        Compiler()
        {
        }

        ~Compiler()
        {
        }

        static bool Compile(std::string& FileName)
        {
            pid_t id = fork();

            if(id < 0)
            {
                logMessage(ERROR, "%s文件中第%d行, %s", __FILE__, __LINE__, "创建子进程失败\n");
                return false;
            }
            else if(id == 0)
            {
                umask(0);
                int _stderr = open(Util::CompileErr(FileName).c_str(), O_CREAT|O_WRONLY, 0644);
                if(_stderr < 0) exit(1);

                // 标准错误重定向
                dup2(_stderr, 2);

                //子进程
                //程序替换，调用g++编译所给的文件
                //g++ -o target source -std=c++11
                execlp("g++", "g++", "-o", Util::exe(FileName).c_str(), Util::src(FileName).c_str(), "-D", "onlineJudge","-std=c++11", nullptr);

                //打开失败直接退出
                logMessage(FATAL, "%s文件中第%d行, %s", __FILE__, __LINE__, "调用程序失败直接退出\n");
                exit(2);
            }
            else
            {
                //父进程
                waitpid(id, nullptr, 0);
                //需要判断是否编译成功
                if(Util::IsFileExits(Util::exe(FileName).c_str()))
                {
                    logMessage(NORMAL, "%s文件中第%d行, %s", __FILE__, __LINE__, "编译成功通过");
                    return true;
                }

                logMessage(ERROR, "%s文件中第%d行, %s", __FILE__, __LINE__, "编译失败未通过\n");
                return false;
            }
        }
    };
}
